(declare (usual-integrations))

(define *tolerance* (expt 10.0 -7))

(define-syntax when
  (syntax-rules ()
    ((when predicate action0 . actions)
     (if predicate
         (begin action0 . actions)
         #f))))

(define-syntax unless
  (syntax-rules ()
    ((unless predicate action0 . actions)
     (if predicate
         #f
         (begin action0 . actions)))))

(define-syntax dotimes
  (syntax-rules ()
    ((dotimes (variable limit-expr return-value ...) body0 body ...)
       (let ((limit limit-expr))
         (do ((variable 0 (fix:+ variable 1)))
             ((fix:>= variable limit) return-value ...)
           body0
           body ...)))))

(define-syntax sum
  (syntax-rules ()
    ((sum index-variable start limit-expr term)
     (let ((limit limit-expr))
       (do ((index-variable start (fix:+ index-variable 1))
            (answer 0 (+ answer term)))
           ((fix:>= index-variable limit) answer))))))

(define-syntax flo:sum
  (syntax-rules ()
    ((sum index-variable start limit-expr term)
     (let ((limit limit-expr))
       (do ((index-variable start (fix:+ index-variable 1))
            (answer 0.0 (flo:+ answer term)))
           ((fix:>= index-variable limit) answer))))))

(define-syntax time-expression
  (syntax-rules ()
    ((time-expression phase form0 forms ...)
     (time-a-thunk phase (lambda () form0 forms ...)))))

;;; Represent matrices as vectors of rows.
;;; Cheesy, but effective.
(define (matrix-height matrix)
  (vector-length matrix))

(define (matrix-width matrix)
  (vector-length (vector-ref matrix 0)))

(define (matrix-ref matrix i j)
  (vector-ref (vector-ref matrix i) j))

(define-integrable (matrix-ref/c matrix i)
  (let ((row (vector-ref matrix i)))
    (lambda (j)
      (vector-ref row j))))

(define (matrix-set! matrix i j value)
  (vector-set! (vector-ref matrix i) j value))

(define (allocate-matrix height width)
  (let ((rows (make-vector height #f)))
    (dotimes (i height rows)
      (vector-set! rows i (make-vector width 0)))))

(define (test-multiply matrix-multiply)
  (let ((matrix-a (allocate-matrix 2 3))
        (matrix-b (allocate-matrix 3 2)))
    ;; a, row 0 (1 0 2)
    (matrix-set! matrix-a 0 0 1)
    (matrix-set! matrix-a 0 1 0)
    (matrix-set! matrix-a 0 2 2)
    ;; a, row 1 (-1 3 1)
    (matrix-set! matrix-a 1 0 -1)
    (matrix-set! matrix-a 1 1 3)
    (matrix-set! matrix-a 1 2 1)
    ;; b, row 0 (3 1)
    (matrix-set! matrix-b 0 0 3)
    (matrix-set! matrix-b 0 1 1)
    ;; b, row 1 (2 1)
    (matrix-set! matrix-b 1 0 2)
    (matrix-set! matrix-b 1 1 1)
    ;; b, row 2 (1 0)
    (matrix-set! matrix-b 2 0 1)
    (matrix-set! matrix-b 2 1 0)

    (let ((result (matrix-multiply matrix-a matrix-b)))
      (or (and (= (matrix-ref result 0 0) 5)
               (= (matrix-ref result 0 1) 1)
               (= (matrix-ref result 1 0) 4)
               (= (matrix-ref result 1 1) 2))
          (error "broken")))))

;(define (matrix-multiply left right)
;  (unless (= (matrix-width left) (matrix-height right))
;    (error "Cannot multiply"))
;  (let* ((result-height (matrix-height left))
;         (result-width  (matrix-width right))
;         (result-matrix (allocate-matrix result-height result-width)))
;    (dotimes (row result-height result-matrix)
;      (let ((set-result-row! (matrix-set!/c result-matrix row))
;	    (ref-left-row (matrix-ref/c left row)))
;      (dotimes (column result-width)
;        (set-result-row! column
;          (sum k
;               0 (matrix-height right)
;               (* (ref-left-row k)
;                  (matrix-ref right k column)))))))))

(define (diagonal-matrix-multiply left right)
  (unless (= (flo:vector-length left) (flo:vector-length right))
    (error "Cannot multiply"))
  (let* ((limit (flo:vector-length left))
	 (result (flo:vector-cons limit)))
    (dotimes (i limit result)
      (flo:vector-set! 
       result i (flo:* (flo:vector-ref left i)
		       (flo:vector-ref right i))))))

(define (compute-diagonal-inverse diagonal)
  (let* ((height  (flo:vector-length diagonal))
         (inverse (flo:vector-cons height)))
    (dotimes (i height inverse)
      (flo:vector-set! inverse i (flo:/ 1.0 (flo:vector-ref diagonal i))))))

(define (vector-times-diagonal-matrix vector matrix)
  (unless (= (flo:vector-length matrix) (flo:vector-length vector))
    (error "Cannot multiply"))
  (let ((result-vector (flo:vector-cons (flo:vector-length vector))))
    (dotimes (i (flo:vector-length vector) result-vector)
      (flo:vector-set! 
       result-vector i
       (flo:* (flo:vector-ref vector i)
	      (flo:vector-ref matrix i))))))

(define (matrix-times-vector matrix vector)
  (unless (= (matrix-width matrix) (flo:vector-length vector))
    (error "Cannot multiply"))
  (let ((result-vector (flo:vector-cons (matrix-height matrix))))
    (dotimes (row (matrix-height matrix) result-vector)
      (let ((row-elements (vector-ref matrix row)))
	(flo:vector-set! 
	 result-vector row
	 (flo:sum column
	   0 (flo:vector-length vector)
	   (flo:* (exact->inexact (vector-ref row-elements column))
	      (flo:vector-ref vector column))))))))

(define (binary-matrix-times-vector matrix vector)
  (unless (= (matrix-width matrix) (flo:vector-length vector))
    (error "Cannot multiply"))
  (let ((result-vector (flo:vector-cons (matrix-height matrix))))
    (dotimes (row (matrix-height matrix) result-vector)
      (let ((row-elements (vector-ref matrix row)))
	(dotimes (column (flo:vector-length vector))
	  (unless (zero? (vector-ref row-elements column))
	    (flo:vector-set! result-vector row
			 (flo:+ (flo:vector-ref result-vector row)
				(flo:vector-ref vector column)))))))))

(define (sparse-binary-matrix-times-vector matrix vector result-vector)
  (unless (= (car matrix) (flo:vector-length vector))
    (error "Cannot multiply"))
  (unless (= (flo:vector-length result-vector) (matrix-height (cdr matrix)))
    (error "Cannot multiply"))
  (dotimes (row (matrix-height (cdr matrix)) result-vector)
    (let ((row-elements (vector-ref (cdr matrix) row)))
      (do ((tail row-elements (cdr tail)))
	  ((null? tail))
	(let ((column (car tail)))
	  (flo:vector-set! result-vector row
			   (flo:+ (flo:vector-ref result-vector row)
				  (flo:vector-ref vector column))))))))

(define (vector-times-binary-matrix vector matrix)
  (unless (= (flo:vector-length vector) (matrix-height matrix))
    (error "Cannot multiply"))
  (let ((result-vector (flo:vector-cons (matrix-width matrix))))
    (dotimes (row (flo:vector-length vector) result-vector)
      (let ((row-elements (vector-ref matrix row)))
	(dotimes (column (matrix-width matrix))
	  (unless (zero? (vector-ref row-elements column))
	    (flo:vector-set! result-vector column
			 (flo:+ (flo:vector-ref result-vector column)
				(flo:vector-ref vector row)))))))))

(define (vector-times-sparse-binary-matrix vector sparse-matrix result-vector)
  (unless (= (flo:vector-length vector) (matrix-height (cdr sparse-matrix)))
    (error "Cannot multiply"))
  (unless (= (car sparse-matrix) (flo:vector-length result-vector))
    (error "Cannot multiply"))
  (dotimes (row (flo:vector-length vector) result-vector)
    (let ((row-elements (vector-ref (cdr sparse-matrix) row)))
      (do ((tail row-elements (cdr tail)))
	  ((null? tail))
	(let ((column (car tail)))
	  (flo:vector-set! result-vector column
			   (flo:+ (flo:vector-ref result-vector column)
				  (flo:vector-ref vector row))))))))

(define (diagonal-matrix-times-vector matrix vector result-vector)
  (unless (= (flo:vector-length matrix) (flo:vector-length vector))
    (error "Cannot multiply"))
  (unless (= (flo:vector-length matrix) (flo:vector-length result-vector))
    (error "Cannot multiply"))
  (dotimes (row (flo:vector-length matrix) result-vector)
    (flo:vector-set! 
     result-vector row
     (flo:* (flo:vector-ref matrix row)
	    (flo:vector-ref vector row)))))

(define (matrix-row-sums sparse-matrix)
  ;; Compute the row sums without multiplying the matrix
  ;; by its transform.
  (let* ((height (matrix-height (cdr sparse-matrix)))
	 (width (car sparse-matrix))
	 (column-sums (flo:vector-cons width)))
    (dotimes (row height)
      (do ((tail (vector-ref (cdr sparse-matrix) row) (cdr tail)))
	  ((null? tail))
	(let ((col (car tail)))
	  (flo:vector-set! column-sums col
			   (flo:+ (flo:vector-ref column-sums col) 1.0)))))
    (let ((result-vector (flo:vector-cons height)))
      (sparse-binary-matrix-times-vector sparse-matrix column-sums result-vector))))

(define (compute-pi row-sums)
  (let* ((length (flo:vector-length row-sums))
         (total  (flo:sum i 0 length (flo:vector-ref row-sums i)))
         (pi     (flo:vector-cons length)))
    (dotimes (i length pi)
      (flo:vector-set! pi i (flo:/ (flo:vector-ref row-sums i) total)))))

(define (compute-d pi)
  (let* ((h (flo:vector-length pi))
         (d (flo:vector-cons h)))
    (dotimes (i h d)
      (flo:vector-set! d i (sqrt (flo:vector-ref pi i))))))

(define (close-enuf? left right tolerance)
  (let ((limit (flo:vector-length left)))
    (define (scan i)
      (or (fix:>= i limit)
	  (and (flo:< (flo:abs (flo:- (flo:vector-ref left i) 
			      (flo:vector-ref right i))) 
		  tolerance)
	       (scan (fix:+ i 1)))))
    (scan 0)))

(define (test-eigenvector matrix eigenvector)
  (or 
   (close-enuf? eigenvector
		(matrix-times-vector matrix eigenvector)
		*tolerance*)
   (error "It's not an eigenvector")))

(define (vector-normalize v result-vector)
  (unless (= (flo:vector-length v) (flo:vector-length result-vector))
    (error "Cannot normalize"))
  (let* ((h      (flo:vector-length v))
         (total (sqrt (flo:sum i
			0 h
			(let ((x (flo:vector-ref v i)))
			  (flo:* x x))))))
    (dotimes (i h result-vector)
      (flo:vector-set! result-vector i (flo:/ (flo:vector-ref v i) total)))))

(define (orthogonal-vector v)
  (let ((limit (flo:vector-length v))
        (n (flo:vector-cons (flo:vector-length v))))

    (dotimes (i (floor (/ limit 2)))
      (flo:vector-set! n i (flo:vector-ref v (- limit i 1)))
      (flo:vector-set! n (- limit i 1) (- (flo:vector-ref v i))))
    (let ((result-vector (flo:vector-cons limit)))
      (vector-normalize n result-vector))))

(define (clear-vector v)
  (dotimes (i (flo:vector-length v))
    (flo:vector-set! v i 0.0)))

(define (analyze sparse-a)
  (let* ((rho      (matrix-row-sums sparse-a))
         (pi       (compute-pi rho))
         (d        (compute-d pi))
         (rinverse (compute-diagonal-inverse rho))
         (dinverse (compute-diagonal-inverse d))
	 (q (let ((drinverse (diagonal-matrix-multiply d rinverse))
		  (temp-0 (flo:vector-cons (flo:vector-length dinverse)))
		  (temp-1 (flo:vector-cons (car sparse-a)))
		  (temp-2 (flo:vector-cons (vector-length (cdr sparse-a)))))
	      (lambda (vin vout)
		(clear-vector temp-0)
		(clear-vector temp-1)
		(clear-vector temp-2)
		(diagonal-matrix-times-vector
		 drinverse
		 (sparse-binary-matrix-times-vector
		  sparse-a
		  (vector-times-sparse-binary-matrix
		   (diagonal-matrix-times-vector dinverse vin temp-0)
		   sparse-a
		   temp-1)
		  temp-2)
		 vout))))

         (first-eigenvector
	  (vector-times-diagonal-matrix pi dinverse)))

    (unless (close-enuf? first-eigenvector (q first-eigenvector (flo:vector-cons (flo:vector-length d))) *tolerance*)
      (pp first-eigenvector)
      (pp (q first-eigenvector (flo:vector-cons (flo:vector-length d))))
      (error "first eigenvector is wrong"))

    (let ((initial-vector (orthogonal-vector first-eigenvector)))
      (time-expression 
       "Converge to second eigenvector"
       (do ((v (vector-normalize (q initial-vector (flo:vector-cons (flo:vector-length d)))  (flo:vector-cons (vector-length (cdr sparse-a))))
	       (vector-normalize (q v temp-0) temp-a))
	    (temp-0 (flo:vector-cons (flo:vector-length d)) (begin
							      (clear-vector temp-0)
							      temp-0))

	    (temp-a (flo:vector-cons (vector-length (cdr sparse-a))) (begin
								       (clear-vector temp-b)
								       temp-b))
	    (temp-b (flo:vector-cons (vector-length (cdr sparse-a))) temp-c)
	    (temp-c (flo:vector-cons (vector-length (cdr sparse-a))) temp-a)
	    (count 0 (+ count 1))
	    (old-v initial-vector v))
	   ((close-enuf? v old-v *tolerance*) 
	    (display "; Converged in ")
	    (display count)
	    (display " iterations.")
	    (newline)
	    (check-answer v)
	    (call-with-output-file
		(string-append "sorted-results-" (number->string (flo:vector-length v)) ".txt")
	      (lambda (oport)
		(for-each (lambda (x) (write x oport) (newline oport))
			  (do ((i 0 (+ i 1))
			       (es *all-entries* (cdr es))
			       (answer '() (cons (cons (flo:vector-ref v i) 
						       (car es))
						 answer)))
			      ((>= i (flo:vector-length v)) 
			       (sort answer (lambda (left right)
					      (< (car left) (car right)))))))))

;	    (call-with-output-file
;		(string-append "second-eigenvector-" (number->string (flo:vector-length v)) ".txt")
;	      (lambda (oport)
;		(dotimes (i (flo:vector-length v))
;		  (write-string (number->string (flo:vector-ref v i)) oport)
;		  (newline oport))))
	    #f))))))

(define (time-a-thunk phase thunk)
  (display ";; Starting phase ")
  (display phase)
  (newline)
  (let ((start (runtime)))
    (let ((answer (thunk)))
      (let ((end (runtime)))
	(display ";; Phase ")
	(display phase)
	(display " took ")
	(display (- end start))
	(display " seconds.")
	(newline)
	answer))))

(define (doit i tolerance)
    (display i)
    (newline)
    (process-unique i)
    (pp (analyze *cluster-matrix*))
    (newline)
    (newline))

(define (timings tolerance)
  (set! *tolerance* tolerance)
  (do ((i  5 (+ i j))
       (j  3 i))
      ((>= i 32768))
    (display i)
    (newline)
    (process-unique i)
    (pp (analyze *cluster-matrix*))
    (newline)
    (newline))
  (do ((il '(32768 35000 40000 45000 50000 55000) (cdr il)))
      ((null? il))
    (let ((i (car il)))

    (display i)
    (newline)
    (process-unique i)
    (pp (analyze *cluster-matrix*))
    (newline)
    (newline))))

(define (vector->floating-vector v)
  (let ((fv (flo:vector-cons (vector-length v))))
    (dotimes (i (vector-length v) fv)
      (flo:vector-set! fv i (vector-ref v i)))))

(define *known-answers*
  (map vector->floating-vector
  (list
   #(.21677264163326387 .20691412628792016 .1549751734737792 -.6656496307324955 -.6656496307324955)
   #(.05929648791252335 .07655143672459752 .08485033310445643 .08485033310445643 .08132383894945694 .05713952548922951 -.6951065219972238 -.6951065219972239)

   #(.03240957826054918 .04469656608593416 4.5608834942558525e-2 2.7417933822724574e-2 
     2.7039737311436236e-2 2.7229492181996065e-2 .02975928683856671 3.2725776755677394e-2
     3.2725776755677394e-2 3.1277720644274275e-2 2.4014154880046334e-2 -.7028743810716978 -.7028743810716976)

   #(1.9897970683982903e-2 1.9897970683982903e-2 .0200094447813234 1.3001862882491416e-2
     1.3339629854215681e-2 1.2298531048477572e-2 1.7896991489223413e-2 1.7772272259031767e-2
     2.1509506830311668e-2 2.9528529438023386e-2 3.0125125654537826e-2 1.8982626067301098e-2
     1.9330960187211258e-2 1.9445684993739144e-2 2.0449265339404905e-2 2.2321470135560413e-2
     2.2321470135560413e-2 2.1405845953081398e-2 .01752017051905523 -.7043221023131748
     -.7043221023131748)

   #(2.862271110840707e-4 2.9627320726377857e-4 2.4190606075114507e-4 .8833689295277539 7.176093446971399e-4
     7.216751525578175e-4 7.495185157007024e-4 7.135203692775477e-4 5.974638964692682e-4 9.493079322824582e-4
     9.493079322824582e-4 3.588046723494281e-4 5.621388867757007e-4 9.615575735155774e-4 9.554523843393666e-4
     9.645956776846232e-4 6.071793936140845e-4 6.167418621067921e-4 5.875877799434918e-4 6.756068600647441e-4
     6.712620763486461e-4 7.801236050481586e-4 1.0709637844644522e-3 1.0926016023306425e-3 6.884767185847886e-4
     7.257181822428582e-4 7.297388123572162e-4 7.416699379964861e-4 8.095725248148473e-4 8.095725248148473e-4
     7.763639513343018e-4 6.668889869543717e-4 -.3313926939651445 -.3313926939651445)

  #(-4.937719952106458e-3 -3.3731048830237115e-3 -4.031631458469417e-3 -7.702421086368564e-3 -7.7549979498759865e-3
    -7.910632151422393e-3 -7.542491813664645e-3 -7.3790971620287865e-3 -7.433961093354399e-3 -7.433961093354399e-3
    -6.9245544289844325e-3 -6.746209766040978e-3 -3.929548269976498e-3 -4.323443078091372e-3 -3.824741428547602e-3
    -2.989937912287704e-3 .43523789050805967 .448632948708936 -4.507501000692031e-3 -3.1228882993451987e-3
    -4.3234430780944196e-3 -4.323443078094517e-3 -4.507501000689975e-3 -3.3731048830242497e-3 .6902327119166827
    -8.693753091088687e-3 -8.740368723324062e-3 -9.104705723220306e-3 -.00864688615618169 -7.098419674303966e-3
    -.01125973389082571 -.01125973389082571 -4.770290672877571e-3 -6.806177254399542e-3 -1.1403175774125342e-2
    -1.1331681804300017e-2 -1.1438755192172204e-2 -7.155436009314384e-3 -7.2681269736492625e-3 -6.924554428986946e-3
    -8.063262916946605e-3 -8.012709046069167e-3 -.00928151263263986 -1.2621002801922961e-2 -1.2938962007619619e-2
    -8.113501801235988e-3 -8.740368723324798e-3 -8.786737052542426e-3 -.00874036872332502 -9.583078577669272e-3
    -9.583078577669272e-3 -.00919353422401607 -7.961834188559317e-3 -.25473084976224375 -.25473084976224375)

  #(2.2671887725961007e-3 .1963256850503209 1.1193347697760554e-2 1.1193347697760554e-2 1.1193347697760554e-2
    1.1193347697760554e-2 1.1193347697760554e-2 1.1193347697760554e-2 1.1193347697760554e-2 1.1193347697760554e-2
    3.6732656373840433e-3 4.316598820063304e-3 5.495302672950313e-3 5.495302672950313e-3 5.495302672950313e-3
    5.436527692471411e-3 .00519478208260012 3.926886144493926e-3 2.999208833764696e-3 .00543652769245978
    7.975543462109677e-3 7.894571380597829e-3 7.853772288972419e-3 5.553455643427381e-3 6.895385457530307e-3
    7.033768190443168e-3 7.1694804069653405e-3 7.1694804069653405e-3 7.562017743484072e-3 7.124530243429152e-3
   .12852533037245542 .00543652769245783 5.495302672936602e-3 5.3771103052230275e-3 6.895385457528856e-3
    3.6732656373840433e-3 3.673265637385798e-3 6.895385457533583e-3 6.9418195542875856e-3 7.0792946734304744e-3
    6.754168065646131e-3 6.6099343347738645e-3 6.658359409520207e-3 6.658359409520205e-3 6.941819554285126e-3
    6.801566317789256e-3 4.1650917325745185e-3 4.007861388331534e-3 4.241521809097838e-3 3.104476082183156e-3
    -.6305940336480671 -.6500014519038195 4.087232685376021e-3 2.7767278217135536e-3 4.241521809097433e-3
    4.241521809097449e-3 4.390392179486438e-3 3.759707243803626e-3 -.2226124022646481 8.670329844349558e-3
    8.744121216135162e-3 .00903326080510527 8.670329844349558e-3 6.848636542524015e-3 1.0481917662874051e-2
    1.0481917662874051e-2 5.377110305223807e-3 7.033768190443135e-3 1.0603804522743898e-2 1.0543037234303856e-2
    1.0634057949479454e-2 6.848636542524024e-3 6.941819554284154e-3 6.754168065642829e-3 7.346531274767758e-3
    7.302670994562036e-3 8.853655188192222e-3 1.1222011887326836e-2 1.1943157950211518e-2 7.214150498996063e-3
    8.558449933301428e-3 8.595905035372964e-3 7.771531569411919e-3 8.595905035372968e-3 8.595905035372968e-3
    .00817446537075035 7.258545690322097e-3 -.18790323682812513 -.18790323682812513)

  #(-1.4049492775318605e-3 -1.4049492775318605e-3 -1.4351666974605386e-3 -1.242890818666155e-3 -1.4049492775317426e-3
    -1.5501572042048834e-3 -1.5501572042048752e-3 -1.2769489277908404e-3 -1.9432248945366478e-3 .3323434649485668
    -1.014816103900546e-3 -1.6828821239339364e-3 -2.132724029102019e-3 -2.4157455247284213e-3 -2.8402767195942775e-3
    -2.9148373418050985e-3 -2.1527500461900233e-3 -2.1527500461900233e-3 -2.008378928870972e-3 -2.008378928870972e-3
    -1.8758091746125982e-3 -1.8758091746125982e-3 .3261308897681038 -2.1527500461900233e-3 -1.276948927781765e-3
    .34160206942197174 .36693948437358737 -1.5501572042048981e-3 .4177818982189861 -2.1527500461900233e-3
    -1.3101219566276005e-3 -1.1718087015374884e-3 -1.0961266709984304e-3 -1.8527922394314022e-3 -2.1527500461900233e-3
    -2.944132925550134e-3 -3.2753048915799866e-3 -3.340168711026427e-3 -1.096126670998506e-3 -2.1527500461900233e-3
    -2.1527500461900233e-3 -1.464760876921866e-3 -1.171808701537588e-3 -2.6038158897921724e-3 -3.2753048915799454e-3
    -3.2091302945650804e-3 -.00131012195663201 -1.7577130523063658e-3 -1.7577130523063658e-3 -1.7577130523063658e-3
    -2.071484697760592e-3 -1.875809174597859e-3 -2.050665227674957e-3 -2.050665227674957e-3 -1.1718087015381762e-3
    -9.263961197155399e-4 .3282006522752253 -4.225016358429056e-3 -4.225016358429056e-3 -4.225016358429056e-3
    -4.225016358429056e-3 -4.225016358429056e-3 -4.225016358429056e-3 -4.225016358429056e-3 -4.225016358429056e-3
    -2.1527500461900233e-3 -1.9651829349476286e-3 -2.0083789288702436e-3 -2.0083789288702436e-3 -2.0083789288702436e-3
    -1.986898322730091e-3 -.00189854708569956 -1.493768858833731e-3 -1.096126670998246e-3 -2.1327240291017235e-3
    -3.044448311721465e-3 -3.0303208651364295e-3 -3.0018665179445143e-3 -.00202963220781431 -2.620243913263655e-3
    -2.668921335705224e-3 -2.7167267119402854e-3 -2.7167267119402854e-3 -2.9000785768870576e-3 -2.700885604816953e-3
    -9.716124472687596e-4 -2.306707735685456e-3 -2.361855945873592e-3 -2.0714846977765234e-3 -2.7324759842372727e-3
    -2.1527500461900233e-3 -1.4351666974595954e-3 -2.5706449062053304e-3 -2.603815889790247e-3 -2.6527947751590515e-3
    -2.5200699003425325e-3 -2.468458906165025e-3 -2.4857816373301494e-3 -2.4857816373301494e-3 -2.885244318087358e-3
    -2.8251284690798844e-3 -1.5222241558600375e-3 -1.5775957450534694e-3 -1.8058784921396454e-3 -1.4937688588342968e-3
    -.2774106335838658 -.28594833598394914 -.00149376885883427 -1.0562540896070299e-3 -1.852792239431365e-3
    -1.8527922394313645e-3 -1.8985470857005222e-3 -1.8058784921395701e-3 -.16514279544508026 -3.2621773642373844e-3
    -3.314375516442356e-3 -3.4163800843132392e-3 -3.288380012995403e-3 -2.5370402597678955e-3 -3.8753930105122976e-3
    -3.8753930105122976e-3 -2.587283558265263e-3 -2.636569578459426e-3 -.00391943298120753 -3.886449789073569e-3
    -3.930365869895548e-3 -2.520069900344153e-3 -2.553897855581831e-3 -2.4684589061666276e-3 -2.748135000595105e-3
    -2.7324759842372636e-3 -3.3529909029376315e-3 -4.122202500892876e-3 -4.462114597193936e-3 -2.636569578459711e-3
    -3.2753048915798856e-3 -3.288380012995697e-3 -2.840276719594609e-3 -3.1415620894998577e-3 -3.1415620894998577e-3
    -2.9875377176691318e-3 -2.7008856048171617e-3 -.177095918418598 -.177095918418598)

  #(4.282295260370791e-4 3.535988934932439e-4 3.2918265519672193e-4 6.770903318150088e-4 7.52869535791282e-4
    6.646656004629862e-4 7.417152964069461e-4 7.800576455625502e-4 8.417337300980389e-4 7.246620905044049e-4
    6.124512490304369e-4 6.892911390864611e-4 3.0280400176512553e-4 8.709354415659868e-4 6.056080035307322e-4
    .375230129441272 7.36074794033373e-4 3.535988934930564e-4 8.709354415659868e-4 8.709354415659868e-4
    8.709354415659868e-4 6.259133242197764e-4 3.979624247011888e-4 .6010466940209409 6.709067289320628e-4
    6.325369300953998e-4 9.66216120672349e-4 8.709354415659868e-4 6.70906728941134e-4 8.709354415659868e-4
    4.4727115262131067e-4 5.164642407333321e-4 8.709354415659868e-4 5.701610837714415e-4 3.4160898551092105e-4
    3.535988934930289e-4 8.063295374061009e-4 8.216895754416261e-4 8.661368626707767e-4 6.520041437225074e-4
    4.472711526215044e-4 9.175420035958364e-4 8.317720333044031e-4 6.77090331814827e-4 6.70906728941082e-4
    7.528695357911185e-4 7.473132271167451e-4 5.00064350817993e-4 3.1626846504765065e-4 6.709067289321708e-4
    5.164642407353672e-4 4.183838530243845e-4 8.709354415659868e-4 5.164642407333912e-4 9.959527806766475e-4
    1.0529096069076668e-3 9.959527806766475e-4 1.0001287016360347e-3 1.0248269565287535e-3 1.0042872588730861e-3
    9.790710021969854e-4 5.47793050294449e-4 4.831080603363039e-4 5.000643508180113e-4 5.916841192246856e-4
    5.774245751137987e-4 5.774245751137987e-4 5.845978262395315e-4 4.472711526213112e-4 6.52004143721667e-4
    3.979624247011708e-4 6.056080035302178e-4 5.401312316949958e-4 .00108411367868296 5.553491734480578e-4
    7.246620905041969e-4 6.832179710191198e-4 5.774245751137898e-4 5.845978262395217e-4 5.91684119224614e-4
    3.873481805500219e-4 4.378538631424193e-4 7.528695357810217e-4 4.7440269757152514e-4 4.183838530241032e-4
    5.401312316948042e-4 5.000643508180114e-4 4.8310806033617155e-4 5.477930502943387e-4 5.477930502943387e-4
    5.477930502943387e-4 5.477930502943388e-4 5.628038583272671e-4 6.19218871593171e-4 .00060560800353029
    6.192188715933222e-4 3.979624247011907e-4 7.303907337258714e-4 3.535988934929793e-4 3.7643476789071546e-4
    5.553491734482922e-4 7.012797098301249e-4 8.515789037906098e-4 1.0568605011149926e-3 1.0879512612273243e-3
    8.709354415659868e-4 8.709354415659868e-4 7.246620905042271e-4 7.188877985578305e-4 6.520041437216226e-4
    6.520041437216226e-4 .17216739103228124 8.709354415659868e-4 4.0830083268675197e-4 6.124512490385411e-4
    6.953112633447632e-4 5.774245751138211e-4 -.3277969465825036 8.709354415659868e-4 4.0830083268670605e-4
    3.8734818055001215e-4 3.6519536686291376e-4 6.709067289320155e-4 8.709354415659868e-4 9.310691509535722e-4
    1.0329284814663852e-3 1.052909606907263e-3 4.4727115262131067e-4 8.709354415659868e-4 8.709354415659868e-4
    5.164642407333505e-4 4.5649420857864497e-4 8.21689575441326e-4 1.0329284814664026e-3 1.0125531370408834e-3
    4.0830083268663666e-4 5.553491734479793e-4 5.553491734479793e-4 5.553491734479794e-4 6.709067289320787e-4
    6.124512490301764e-4 6.64665600454624e-4 6.64665600454624e-4 3.764347678904921e-4 3.535988934931135e-4
    6.05608003538593e-4 1.3261922798789038e-3 1.3261922798789038e-3 1.3261922798789038e-3 1.3261922798789038e-3
    1.3261922798789038e-3 1.3261922798789038e-3 1.3261922798789038e-3 1.3261922798789038e-3 8.709354415659868e-4
    7.360747940333857e-4 6.646656004544863e-4 6.646656004544863e-4 6.646656004544863e-4 6.583653103930147e-4
    6.325369300952803e-4 4.916593093397182e-4 3.53598893493062e-4 7.853823329430067e-4 1.0647183081990814e-3
    1.0647183081990853e-3 1.0529096069076486e-3 6.455803009167253e-4 8.99189309526963e-4 9.129884171573483e-4
    9.355347360502803e-4 9.355347360502803e-4 1.0248269565287437e-3 9.705199999720494e-4 3.4160898550960423e-4
    7.906711626191431e-4 8.063295374060232e-4 6.455803009166098e-4 8.564590520739844e-4 8.709354415659868e-4
    4.916593093396775e-4 8.011440846655834e-4 8.216895754414732e-4 8.367677060481503e-4 7.853823329428543e-4
    7.692977144141696e-4 7.746963610999454e-4 7.746963610999453e-4 1.0529096069076304e-3 1.036955508362747e-3
    5.000643508179653e-4 5.323591540995501e-4 6.953112633352222e-4 5.701610837708553e-4 -.39157794485658065
    -.40362930682649245 4.916593093398021e-4 3.2918265519653854e-4 6.892911390857814e-4 6.892911390857837e-4
    7.012797098301406e-4 6.646656004545745e-4 -.21086112918759525 1.1293043036715619e-3 1.1798410525456367e-3
    1.218078475615193e-3 1.172754856001341e-3 8.114818552451559e-4 1.2749189414365744e-3 1.2749189414365744e-3
    9.875479655896417e-4 9.038124212834262e-4 1.2879286553331643e-3 1.274918941436577e-3 1.2911606018334543e-3
    7.959248494023948e-4 8.06329537406074e-4 7.959248494024465e-4 9.129884171572197e-4 9.084120052952918e-4
    1.052909606907306e-3 1.2976003455314044e-3 1.4055278027044584e-3 8.216895754413919e-4 .00107251854660472
    1.076397469018639e-3 8.851751119813917e-4 9.79071002196734e-4 9.79071002196734e-4 9.310691509536644e-4
    9.038124212832874e-4 2.5823212036786835e-4 2.582321203678684e-4)

  #(-2.7808736535490594e-4 -1.735787363204644e-4 -1.3813785099790968e-4 -1.5198467983758822e-4 -1.9535642235831072e-4
    -1.3066532579385554e-4 -3.338853658063674e-4 -1.5525354154443438e-4 -2.0043146028043564e-4 -1.306653257938482e-4
    -2.475145948463967e-4 -3.613329536286036e-4 -3.996082604549436e-4 -4.228106286532425e-4 -4.3452505137182563e-4
    -4.070782202038702e-4 -4.2987759099849656e-4 -1.051071444968905e-4 -2.6133065158769335e-4 -2.8697417837464064e-4
    -4.0336053301493445e-4 -1.6159300936487215e-4 -4.008629205608653e-4 -3.9834964863431135e-4 -2.8697417837465127e-4
    -2.8697417837465127e-4 -2.8697417837465127e-4 -2.8697417837465127e-4 -2.8697417837465127e-4 -2.8697417837465127e-4
    -1.927688058267899e-4 -1.927688058267899e-4 -4.0460355763493445e-4 -5.264903749015934e-4 -5.283945054384349e-4
    -5.283945054384353e-4 -5.359433808076728e-4 -5.350055963957802e-4 -5.216996440292554e-4 -5.20736208961407e-4
    -5.20736208961407e-4 -5.226613031753984e-4 -2.149387954992511e-4 -3.7363133793721345e-4 -2.413514385532252e-4
    -5.615658880493532e-4 -5.552711156033441e-4 -5.633514756652069e-4 -4.526379661249587e-4 -4.5374601665964295e-4
    -4.470565200217658e-4 -4.526379661249596e-4 -4.492974188747124e-4 -4.4593184774942664e-4 -4.5374601665964295e-4
    -4.5374601665964295e-4 -4.526379661249587e-4 -4.526379661249587e-4 -4.7747300581611377e-4 -4.7747300581611377e-4
    -4.6033831382475066e-4 -4.4593184774942664e-4 -4.448043317914791e-4 -2.707679924640575e-4 -2.7261625960270505e-4
    -2.938902109305704e-4 -2.938902109305704e-4 -4.391233281171706e-4 -4.711205320749204e-4 -3.749729269500806e-4
    -3.9834964863430744e-4 -4.008629205608654e-4 -4.63599310768772e-4 -4.732474978867436e-4 -4.6683752924924686e-4
    -4.614278734881255e-4 -2.8167573783259553e-4 -3.5289600144724104e-4 -4.1923247719121863e-4 -4.5263796612496034e-4
    -4.45931847749428e-4 -4.470565200217672e-4 -4.45931847749428e-4 -4.4929741887471365e-4 -4.4817837001658874e-4
    -4.470565200217672e-4 -4.45931847749428e-4 -4.5041368747434133e-4 -4.45931847749428e-4 -4.559540395127583e-4
    -4.45931847749428e-4 -4.4480433179148044e-4 -2.053811305442932e-4 -1.4522639013564607e-4 -1.5525354154443844e-4
    -1.4522639013564082e-4 -1.9276880582678674e-4 -1.6467124804394166e-4 -1.6159300936487232e-4 -3.6684980633085347e-4
    -4.0707822020386605e-4 -3.8683791083125385e-4 -2.887187183238264e-4 -3.695773517391097e-4 -2.7627570199580516e-4
    -2.434231627197076e-4 -3.613329536286025e-4 -3.9960826045494263e-4 -3.585426960132679e-4 -3.9960826045494263e-4
    -3.613329536286025e-4 -3.9960826045494263e-4 -1.0021573014021472e-4 -8.963567400331788e-5 -7.086322236370711e-5
    -1.7066123885011133e-4 -3.0561690214725835e-4 -2.834528894548292e-4 -2.938902109305675e-4 -2.8697417837463863e-4
    -8.963567400331875e-5 -3.7363133793721345e-4 -3.613329536286037e-4 -1.584549823099306e-4 -3.7363133793721345e-4
    -3.5994052858940044e-4 -2.1021428899378446e-4 -2.263189830624868e-4 -2.3288031231664743e-4 -3.641018290141944e-4
    -3.088856250970521e-4 -3.121201177513298e-4 -2.3071393674406216e-4 -2.2183697523390575e-4 -2.2183697523390575e-4
    -2.434231627197071e-4 -2.392617763767495e-4 -2.4547740304398525e-4 -2.780873653549021e-4 -2.285270254284808e-4
    -2.350267200159386e-4 -2.2852702542848076e-4 -2.555009817769548e-4 -3.3984807565538296e-4 -1.5198467983758694e-4
    -1.6467124804393825e-4 -1.5198467983758594e-4 -2.3502672001592803e-4 -2.6890702200994365e-4 -2.4342316271969852e-4
    -2.762757019957993e-4 -3.023128385705481e-4 -3.323779749666057e-4 -2.81675737832598e-4 -2.125896670911255e-4
    -2.5352797169589565e-4 -1.7644800072362009e-4 -3.7363133793721345e-4 -3.471574726409237e-4 .8158537242119226
    -3.0231283857054753e-4 -2.0292138755415303e-4 -3.7363133793721345e-4 -3.7363133793721345e-4 -3.7363133793721345e-4
    -2.6890702200995503e-4 -1.5198467983758987e-4 .36317559875568184 -2.392617763767516e-4 -2.2631898306248364e-4
    -3.919959773815407e-4 -3.7363133793721345e-4 -2.3288031231663157e-4 -3.7363133793721345e-4 -2.0043146028044334e-4
    -2.2183697523392071e-4 -3.7363133793721345e-4 -2.1956166405858588e-4 -2.707679924640579e-4 -1.2273870152198983e-4
    -2.90452780271263e-4 -2.9559393657104595e-4 -3.789691989011378e-4 -2.834528894548311e-4 -2.0043146028043106e-4
    -4.008629205608698e-4 -3.736313379372287e-4 -2.4135143855321542e-4 -2.55500981776943e-4 -2.744520800732204e-4
    -2.8697417837462774e-4 -1.927688058267884e-4 -1.227387015219938e-4 -3.056169021472596e-4 -1.927688058267844e-4
    -1.4864394924981613e-4 -3.7363133793721345e-4 -2.0781176107335082e-4 -4.1198295400582765e-4 -4.298775909984998e-4
    -4.1198295400582765e-4 -4.132000407165052e-4 -4.263587520767126e-4 -4.1682997903027803e-4 -4.095379297181888e-4
    -2.0043146028043903e-4 -1.7644800072362632e-4 -1.792713480066419e-4 -2.1258966709111882e-4 -2.0781176107334586e-4
    -2.4135143855322233e-4 -2.1021428899377663e-4 -1.5525354154442573e-4 -5.302917988155523e-4 -1.584549823099346e-4
    -2.1258966709117652e-4 -2.195616640585951e-4 -4.668375292492455e-4 -2.0292138755415194e-4 -2.762757019958146e-4
    -2.651458994077752e-4 -2.1021428899378717e-4 -2.125896670911293e-4 -2.149387954992558e-4 -1.486439492498209e-4
    -1.6467124804394397e-4 -3.278142163980054e-4 -1.7644800072368067e-4 -1.452263901356984e-4 -2.149387954992929e-4
    -1.7644800072388252e-4 -1.676929908765392e-4 -1.9014597877202956e-4 -1.9014597877202956e-4 -1.9014597877202956e-4
    -1.901459787720296e-4 -2.3288031231668042e-4 -2.5153948631477096e-4 -2.49535155676963e-4 -2.555009817769534e-4
    -1.4522639013563014e-4 -3.763097330687349e-4 -1.2273870152512405e-4 -1.4522639013566144e-4 -1.953564223583149e-4
    -2.972878984996207e-4 -3.6410182901419223e-4 -4.2517933418224565e-4 -4.481783700165945e-4 -3.7363133793721345e-4
    -3.7363133793721345e-4 -3.1690996461986357e-4 -3.1532143349066613e-4 -2.2852702542848315e-4 -2.2852702542848315e-4
    -8.963567400331821e-5 -3.7363133793721345e-4 -1.5525354154444094e-4 -2.1258966709111215e-4 -2.4953515567695223e-4
    -2.392617763767506e-4 -.29825067303050695 -3.7363133793721345e-4 -1.5198467983759464e-4 -1.3445351100497651e-4
    -1.2676398584794533e-4 -3.056169021472596e-4 -3.7363133793721345e-4 -3.3388536580637425e-4 -3.7363133793722164e-4
    -3.8029195754384103e-4 -2.4135143855322813e-4 -3.7363133793721345e-4 -3.7363133793721345e-4 -1.8748646347504106e-4
    -2.0781176107335152e-4 -2.938902109305712e-4 -3.736313379372228e-4 -3.6684980633086176e-4 -1.4522639013563637e-4
    -2.1493879549925191e-4 -2.1493879549925191e-4 -2.1493879549925191e-4 -2.613306515877277e-4 -2.4342316271974023e-4
    -2.5940198573355677e-4 -2.594019857335567e-4 -1.344535110050942e-4 -1.9535642235831072e-4 -2.102142889937702e-4
    -4.679119553637142e-4 -4.679119553637142e-4 -4.679119553637142e-4 -4.679119553637142e-4 -4.679119553637142e-4
    -4.679119553637142e-4 -4.679119553637142e-4 -4.6791195536371414e-4 -3.7363133793721345e-4 -3.5994052858940093e-4
    -2.371537020124325e-4 -2.371537020124325e-4 -2.371537020124325e-4 -2.350267200159336e-4 -2.2631898306247678e-4
    -1.764480007236188e-4 -1.7644800072361916e-4 -3.153214334906712e-4 -4.144135529937142e-4 -4.1441355299371433e-4
    -4.107622610885926e-4 -2.2631898306248202e-4 -3.413224777002287e-4 -3.4570795702975086e-4 -3.557305530186571e-4
    -3.557305530186571e-4 -4.0211366594202863e-4 -3.7764180708578613e-4 -1.267639858479665e-4 -3.5713939240541727e-4
    -3.61332953628605e-4 -2.5550098177695246e-4 -3.308637166359393e-4 -3.7363133793721345e-4 -1.9791020947235717e-4
    -2.852189681578818e-4 -2.9389021093057015e-4 -2.9897226267845657e-4 -2.798873023679099e-4 -2.7445208007323397e-4
    -2.762757019958116e-4 -2.762757019958116e-4 -4.3336785876773584e-4 -4.287078538887731e-4 -2.1726252568591027e-4
    -2.454774030439872e-4 -2.8871871832382537e-4 -2.7627570199580516e-4 -1.486439492498132e-4 -1.5525354154443112e-4
    -1.9014597877192168e-4 -1.2676398584794417e-4 -3.10507083088852e-4 -3.072556104204447e-4 -3.137248590116099e-4
    -3.383672491094736e-4 -.3368862576206903 -4.322075679071099e-4 -4.592461691928053e-4 -4.8270287710645415e-4
    -4.5705405085696304e-4 -2.8345288945483727e-4 -4.6576062463328554e-4 -4.6576062463328554e-4 -4.083099271645263e-4
    -3.41322477700229e-4 -4.700534400318788e-4 -4.635993107687726e-4 -4.71120532074921e-4 -2.780873653549028e-4
    -2.81675737832598e-4 -2.7988730236790804e-4 -3.413224777002304e-4 -3.398480756553884e-4 -3.7497292695008044e-4
    -4.679119553637171e-4 -5.100183207485759e-4 -2.8521896815788026e-4 -4.0086292056086244e-4 -4.0211366594202934e-4
    -3.072556104204501e-4 -3.4570795702975184e-4 -3.4570795702975184e-4 -3.2934249608787894e-4 -3.383672491094847e-4
    -8.963567400331574e-5 -8.963567400331574e-5)

  #(-1.1309232630970366e-4 -1.227696009161847e-4 -1.308386593952339e-4 -1.2825656312394105e-4 -1.1169174810969095e-4
    -1.0937756454133086e-4 -1.1169174810969095e-4 -1.1984995887295892e-4 -1.1274381291917889e-4 -1.2308973079710894e-4
    -1.308386593952339e-4 -1.2260922253169428e-4 -1.2825656312394105e-4 -1.1169174810969095e-4 -1.308386593952339e-4
    -1.2825656312394105e-4 -1.1169174810969095e-4 -1.227696009161847e-4 -1.308386593952339e-4 -1.2825656312394105e-4
    -1.308386593952339e-4 -1.2825656312394105e-4 -1.2825656312394105e-4 -1.181967768127481e-4 -1.2593428482734201e-4
    -1.2593428482734201e-4 -1.260904340315586e-4 -1.203414850320873e-4 -1.1952115178182559e-4 -1.2034148503208767e-4
    -1.171936742881894e-4 -9.241050084554396e-5 -1.1803018507835164e-4 -1.1769629421117905e-4 -1.1447577011962903e-4
    -1.134397689909761e-4 -1.1378615077113517e-4 -7.631718007975335e-5 -7.631718007975335e-5 -5.173040916043662e-5
    -5.248563756392469e-5 -7.01368833895003e-5 -9.346907490174648e-5 -6.985577250520979e-5 -5.173040916043662e-5
    -2.080596193931348e-5 -2.0805961939312715e-5 -2.429612910301347e-5 -3.136616779777761e-5 -2.6615075939578615e-5
    -2.1731118505797534e-5 .4191710012609847 -4.435845989247992e-5 -4.479984847425364e-5 -2.173111850326479e-5
    -6.335655331423118e-5 .6986183354349251 -3.657892311089962e-5 -8.849484956343524e-5 -2.347229068707019e-5
    -4.736187474843033e-5 -.00006458689251721 -3.7112950236335574e-5 -1.0134718977556799e-4 -1.1902623805439883e-4
    -8.298707957403745e-5 -1.0327045786830873e-4 -1.0173475214491997e-4 -1.0682931804936327e-4 -9.978188814139056e-5
    -1.0327045786830873e-4 -1.1221901342318448e-4 -1.1550247919518759e-4 -1.0327045786830873e-4 -1.1361309188651943e-4
    -1.1685739332441307e-4 -1.044074146030181e-4 -1.044074146030181e-4 -1.0534550545965559e-4 -1.08836534523625e-4
    -1.0534550545965559e-4 -1.08836534523625e-4 -1.2164251187009462e-4 -9.32583213643338e-5 -9.367935430114164e-5
    -5.468878227065112e-5 -6.0170742516040286e-5 -8.131040008006575e-5 -8.692447402317684e-5 -2.9424073552786564e-5
    -3.136616779777608e-5 -1.774338395971214e-5 -8.155203627422858e-5 -5.783635569329124e-5 -4.694458137413587e-5
    -4.208213003369738e-5 -4.065520004002468e-5 -4.479984848109449e-5 -4.4358459899283e-5 -4.4358459899283e-5
    -4.818562128136356e-5 -4.818562128136356e-5 -4.8592258206053006e-5 -5.8848147105589926e-5 -3.815859003987588e-5
    -1.8819700678667492e-5 -5.715187767079167e-5 -3.3782396591854364e-5 -1.8819700678668224e-5 -4.208213003370076e-5
    -5.134862970529652e-5 -5.134862970529652e-5 -2.8747567638802676e-5 -3.492788625260529e-5 -4.346223701158812e-5
    -3.711295023635019e-5 -1.05532122976114e-4 -1.05532122976114e-4 -1.0478365875781725e-4 -1.18030185078353e-4
    -1.18030185078353e-4 -1.1769629421118061e-4 -1.1769629421118061e-4 -7.95984104497772e-5 -7.527880271464769e-5
    -7.527880271464769e-5 -7.527880271464769e-5 -7.527880271464769e-5 -7.527880271464769e-5 -7.527880271464769e-5
    -7.527880271464769e-5 -7.342631628443476e-5 -7.396033289329799e-5 -8.369537474739622e-5 -9.176949541457595e-5
    -8.981903559386096e-5 -8.981903559386096e-5 -9.241050084554308e-5 -9.304709046715179e-5 -9.069108551661491e-5
    -7.605891477027797e-5 -7.984522781872113e-5 -9.219732754929037e-5 -8.760093927626499e-5 -8.715054585886645e-5
    -8.782526983378189e-5 -8.46305476248277e-5 -8.827222065838026e-5 -6.458689251721276e-5 -7.81011279712064e-5
    -3.492788625260462e-5 -3.492788625260462e-5 -5.468878227066197e-5 -3.548676791943178e-5 -6.082125593505612e-5
    -6.082125593505612e-5 -1.1045167441351721e-4 -1.1045167441351721e-4 -1.0973676933270202e-4 -1.2228783476389413e-4
    -1.2244863409011233e-4 -1.2244863409011233e-4 -1.221268237200524e-4 -1.221268237200524e-4 -1.230897307971107e-4
    -1.248357716358785e-4 -1.224486340901123e-4 -1.2276960091618647e-4 -8.89384355486462e-5 -4.1611923878625464e-5
    -9.472374949686357e-5 -5.2109391583459145e-5 -2.661507593957491e-5 -9.472374949686508e-5 -5.7151877670792924e-5
    -6.273233559555853e-5 -3.657892311089808e-5 -5.984283412102405e-5 -1.0346081832087592e-4 -1.106296788390984e-4
    -1.106296788390984e-4 -1.0719706205619652e-4 -1.106296788390984e-4 -1.106296788390984e-4 -6.241788581793292e-5
    -6.241788581793292e-5 -5.3230151879143035e-5 -5.1730409160431984e-5 -5.01858684764425e-5 -5.210939158346069e-5
    -5.248563756392016e-5 -4.899552037540356e-5 -5.359853102809237e-5 -4.6944581374138186e-5 -5.9513119027205346e-5
    -5.285920553493322e-5 -5.575771950255655e-5 -5.05764258724114e-5 -4.1611923878625e-5 -1.122190134232015e-4
    -1.122190134232015e-4 -1.0515855676672207e-4 -1.122190134232015e-4 -1.1098483120961852e-4 -1.1098483120961852e-4
    -4.8592258206015046e-5 -5.2485637563877476e-5 -5.39643955553786e-5 -5.851282729848224e-5 -5.984283412099288e-5
    -5.984283412099288e-5 -6.114391738188948e-5 -6.04968735904571e-5 -5.173040916039034e-5 -6.697980560864494e-5
    -6.304521701577674e-5 -6.579422863899946e-5 -3.378239659185506e-5 -9.472374949686508e-5 -9.155482963423352e-5
    -3.657892311089746e-5 -4.4799848481099226e-5 -4.435845989928797e-5 -5.2859205534933044e-5 -6.549448116374625e-5
    -5.575771950256097e-5 -6.519335551738057e-5 -5.1348629705313064e-5 -4.523693052387877e-5 -4.818562128136889e-5
    -4.859225820605838e-5 -6.519335551738015e-5 -6.519335551738015e-5 -6.519335551738015e-5 -4.161192387862339e-5
    -2.8747567638801897e-5 -3.6036983179232376e-5 -4.3912634916890265e-5 -2.6615075939572744e-5 -9.616684945340558e-5
    -3.657892311089718e-5 -4.346223701158493e-5 -2.5865204580217578e-5 -5.173040916043189e-5 -9.133965934937851e-5
    -1.0076305125156927e-4 -1.0056758443073542e-4 -1.0212084367343872e-4 -9.69818373251601e-5 -1.009581396263744e-4
    -3.2596677758690334e-5 -5.645910203600275e-5 -6.210184385900524e-5 -8.737603277095247e-5 -3.1987340333500094e-5
    -8.322384775724583e-5 -8.274963393837918e-5 -5.8175574764461805e-5 -5.8175574764461805e-5 -5.8175574764461805e-5
    -5.8175574764461805e-5 -5.8175574764461805e-5 -5.8175574764461805e-5 -4.5236930523879526e-5 -4.5236930523879526e-5
    -8.64705572181646e-5 -1.0534550545965943e-4 -1.0571841106986107e-4 -1.057184110698621e-4 -1.07197062056188e-4
    -1.0701334801876584e-4 -1.0478365875780888e-4 -1.044074146030226e-4 -1.0459570585535622e-4 -1.049712751278447e-4
    -4.523693052387811e-5 -9.472374949686508e-5 -4.859225820605912e-5 -1.1221901342319516e-4 -1.111619818909273e-4
    -1.1256915160140779e-4 -1.0609000592762544e-4 -1.0627531612287183e-4 -1.0515855676672203e-4 -1.0682931804937467e-4
    -1.0847434871216839e-4 -1.0497127512785181e-4 -1.0627531612287183e-4 -1.0627531612287183e-4 -1.0609000592762544e-4
    -1.0609000592762544e-4 -1.1256915160141381e-4 -1.1256915160141381e-4 -1.0756354880750965e-4 -1.0497127512785181e-4
    -1.0478365875781596e-4 -5.6459102036002575e-5 -5.680654594326687e-5 -6.178418528552072e-5 -6.178418528552072e-5
    -9.176949541457453e-5 -9.859160433478062e-5 -7.501696260754161e-5 -8.369537474739631e-5 -8.416426006739784e-5
    -9.718451641211562e-5 -9.898995587377238e-5 -9.81916367452975e-5 -9.657520309260849e-5 -5.5757719502561014e-5
    -7.475420536376017e-5 -8.509428012424847e-5 -9.262318352236229e-5 -9.025611377406571e-5 -9.047386104776251e-5
    -9.025611377406571e-5 -9.090779092836497e-5 -9.06910855166183e-5 -9.047386104776251e-5 -9.025611377406571e-5
    -9.112398098617101e-5 -9.025611377406571e-5 -9.241050084554484e-5 -9.025611377406571e-5 -9.003783990247852e-5
    -5.50474010788946e-5 -4.065520004003078e-5 -3.8670808798420504e-5 -3.073244251643004e-5 -4.346223701157005e-5
    -3.259667775869007e-5 -3.198734033349981e-5 -1.0115285174483419e-4 -1.100948021577938e-4 -9.859160433478444e-5
    -8.033658770454102e-5 -1.0534550545966638e-4 -7.83526620458265e-5 -5.6806545943266057e-5 -9.112398098617196e-5
    -1.0056758443074038e-4 -9.069108551661926e-5 -1.0056758443074039e-4 -9.112398098617196e-5 -1.0056758443074039e-4
    -2.173111850579396e-5 -1.774338395971605e-5 -1.4027376677899702e-5 -4.6523545233574816e-5 -8.959969696220366e-5
    -6.458689251721413e-5 -6.697980560864653e-5 -6.519335551738113e-5 -1.7743383959715692e-5 -9.472374949686508e-5
    -1.0250548098107496e-4 -3.917633102291219e-5 -9.472374949686508e-5 -1.0231334307835309e-4 -5.884814710558757e-5
    -4.479984848109854e-5 -4.609866377464305e-5 -7.657457433519266e-5 -6.146488503285677e-5 -6.210184385900113e-5
    -4.5669829674684565e-5 -4.391263491688673e-5 -4.391263491688673e-5 -4.818562128136449e-5 -4.7361874748426346e-5
    -5.018586847644296e-5 -6.0496873590482374e-5 -4.523693052387583e-5 -4.6523545233571354e-5 -4.523693052387583e-5
    -5.1348629705311756e-5 -9.698183732516577e-5 -3.815859003987335e-5 -4.254714006212396e-5 -3.9176331022912835e-5
    -4.777552342967125e-5 -5.4688782270666805e-5 -4.979224774442984e-5 -5.645910203600492e-5 -6.929012941042793e-5
    -8.106804365399988e-5 -6.21018438590042e-5 -4.652354523357012e-5 -6.273233559555252e-5 -3.6036983179233596e-5
    -9.472374949686508e-5 -8.893843554864691e-5 -.2508116582402008 -6.697980560864606e-5 -6.0170742516043525e-5
    -9.472374949686508e-5 -9.472374949686508e-5 -9.472374949686508e-5 -7.396033289331907e-5 -3.259667775869004e-5
    -.444292944666682 -7.759561374065608e-5 -6.957352580548796e-5 -8.647055721816403e-5 -9.472374949686508e-5
    -4.736187474843372e-5 -9.472374949686508e-5 -4.346223701158628e-5 -4.7361874748429015e-5 -9.472374949686508e-5
    -4.4799848481099687e-5 -5.468878227065949e-5 -2.4296129103029885e-5 -6.60926166942563e-5 -6.756479318370988e-5
    -9.839182377623444e-5 -7.097353583886282e-5 -4.7775523429667064e-5 -8.624270291639846e-5 -7.959841044977105e-5
    -4.8185621281371944e-5 -5.096399035908584e-5 -5.504740107889872e-5 -5.749513527760699e-5 -3.967541268479887e-5
    -2.429612910302844e-5 -8.251150500168768e-5 -4.2547140062123376e-5 -3.7112950236345975e-5 -9.472374949686508e-5
    -4.652354523357461e-5 -8.981903559385871e-5 -9.513829742710882e-5 -8.981903559385871e-5 -9.003783990247429e-5
    -9.283537895171846e-5 -9.069108551661406e-5 -8.937982007380295e-5 -4.161192387862044e-5 -3.6578923110898635e-5
    -3.657892311089734e-5 -4.4799848481101984e-5 -4.391263491689175e-5 -5.018586847644783e-5 -4.435845989929045e-5
    -3.378239659185488e-5 -1.0627531612286356e-4 -3.319483182961672e-5 -5.1348629705312725e-5 -4.694458137414027e-5
    -1.1256915160141102e-4 -4.435845989926307e-5 -6.519335551735451e-5 -5.9513119027182476e-5 -4.566982967466157e-5
    -4.609866377461812e-5 -4.65235452335479e-5 -4.30071225119411e-5 -3.867080879822705e-5 -8.849484956342812e-5
    -3.8670808798419075e-5 -3.319483182961757e-5 -4.523693052387808e-5 -3.657892311089775e-5 -3.9176331022907346e-5
    -4.2082130033698566e-5 -4.208213003369856e-5 -4.208213003369856e-5 -4.2082130033698566e-5 -4.694458137413563e-5
    -5.0576425872410374e-5 -5.7836355693303966e-5 -5.8848147105587114e-5 -3.1366167797779466e-5 -1.0991593152437454e-4
    -2.4296129103032026e-5 -2.942407355278225e-5 -4.6523545233553505e-5 -7.657457433520119e-5 -9.241050084553962e-5
    -9.112398098616661e-5 -9.57567544103674e-5 -9.472374949686508e-5 -9.472374949686508e-5 -8.555549911285474e-5
    -8.393014484320005e-5 -4.56698296746778e-5 -4.56698296746778e-5 -2.261846526193974e-5 -9.472374949686508e-5
    -3.073244251643043e-5 -4.208213003370233e-5 -4.979224774443072e-5 -4.777552342966625e-5 -.27553878735794873
    -9.472374949686508e-5 -3.0085371258021637e-5 -2.734439113533198e-5 -2.5865204580218282e-5 -8.25115050016908e-5
    -9.472374949686508e-5 -6.843289892905291e-5 -7.83526620458036e-5 -8.106804365398196e-5 -5.173040916043598e-5
    -9.472374949686508e-5 -9.472374949686508e-5 -3.967541268480152e-5 -4.2547140062120306e-5 -6.146488503284991e-5
    -8.058114409276313e-5 -7.784878117914652e-5 -2.874756763879895e-5 -4.300712251195639e-5 -4.300712251195639e-5
    -4.300712251195639e-5 -5.323015187914705e-5 -4.9792247744427275e-5 -5.2859205534933315e-5 -5.2859205534933315e-5
    -2.6615075939574878e-5 -4.5669829674687784e-5 -4.161192387862749e-5 -9.978188814137076e-5 -9.978188814137076e-5
    -9.978188814137076e-5 -9.978188814137076e-5 -9.978188814137076e-5 -9.978188814137076e-5 -9.978188814137076e-5
    -9.978188814137076e-5 -9.472374949686508e-5 -1.0627531612287218e-4 -4.818562128137063e-5 -4.818562128137063e-5
    -4.818562128137063e-5 -4.77755234296699e-5 -4.609866377464724e-5 -3.6578923110900105e-5 -3.603698317923409e-5
    -7.422590047269964e-5 -9.657520309260562e-5 -9.346907490174101e-5 -9.283537895171787e-5 -4.47998484811004e-5
    -8.082496051712089e-5 -8.155203627422407e-5 -8.322384775724747e-5 -8.322384775724747e-5 -9.451579370375441e-5
    -8.782526983377976e-5 -2.5092934238223054e-5 -9.02561137740651e-5 -9.409850339333855e-5 -5.05764258724128e-5
    -7.013688338948619e-5 -9.472374949686508e-5 -4.1136343415374006e-5 -5.645910203600374e-5 -5.984283412104739e-5
    -6.082125593505458e-5 -5.540369865662096e-5 -5.4327796264485497e-5 -5.4688782270664826e-5 -5.4688782270664826e-5
    -9.241050084554117e-5 -9.112398098616719e-5 -4.391263491689176e-5 -6.489083251370954e-5 -6.549448116374565e-5
    -7.860339120521611e-5 -3.073244251642933e-5 -3.198734033349915e-5 -4.6523545233575216e-5 -2.586520458021863e-5
    -8.43977258697531e-5 -8.345994425360612e-5 -8.486273063348525e-5 -9.677873377799586e-5 -1.4027376677900419e-5
    -9.003783990247452e-5 -9.596202100049933e-5 -1.0134718977556365e-4 -9.55510468593348e-5 -6.114391738194281e-5
    -9.758861177843556e-5 -9.758861177843556e-5 -1.0017550658543598e-4 -7.288838730908684e-5 -9.839182377623237e-5
    -9.698183732516119e-5 -9.859160433478044e-5 -5.645910203600079e-5 -5.7151877670790654e-5 -5.8848147105586274e-5
    -7.396033289330333e-5 -7.369380830433126e-5 -8.439772586951207e-5 -9.779003327601618e-5 -1.0865559252891174e-4
    -6.428151542809947e-5 -8.89384355486196e-5 -8.915940094644354e-5 -6.871983058131895e-5 -8.555549911282686e-5
    -8.509428012422161e-5 -7.885332312749309e-5 -7.396033289330071e-5 -1.8819700678667956e-5 -1.8819700678667956e-5)

)))

(define (check-answer v)
  (define (scan tail)
    (cond ((null? tail) (display "; Can't check answer") (newline))
	  ((= (flo:vector-length (car tail)) (flo:vector-length v))
	   (unless (close-enuf? v (car tail) *tolerance*)
	     (pp v)
	     (pp (car tail))
	     (error "Answer didn't check.")))
	  (else (scan (cdr tail)))))
  (scan *known-answers*))

;; Local Variables:
;; Eval: (put 'dotimes 'scheme-indent-function 1)
;; Eval: (put 'sum 'scheme-indent-function 1)
;; Eval: (put 'unless 'scheme-indent-function 1)
;; Eval: (put 'when 'scheme-indent-function 1)
;; End:
